package com.easylinkin.linkappapi.common.utils;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

/**
 * 
 * Mybatis &lt;if test="?">&lt;/if> test参数校验<br>
 * 使用方式:&lt;if test="@com.easylinkin.linkappapi.common.utils.MybatisUtil@isNotEmpty(userId)">&lt;/if>
 */
public class MybatisUtil
{
    /**
     * 
     * 校验属性是否为空
     * @param obj 需要校验的属性(属性可以是:Collection，Array,String,Map)
     * @return true空，false非空
     */
    @SuppressWarnings("rawtypes")
    public static boolean isEmpty(Object obj)
    {
        if (obj == null)
        {
            return true;
        }
        
        if (obj instanceof String)
        {
            return StringUtils.isEmpty((String)obj);
        }
        else if (obj instanceof Collection<?>)
        {
            return CollectionUtils.isEmpty((Collection<?>)obj);
        }
        else if (obj.getClass().isArray())
        {
            return Array.getLength(obj) == 0;
        }
        else if (obj instanceof Map)
        {
        	Map<?, ?> map = (Map)obj;
            return map.isEmpty();
        }
        
        return false;
    }
    
    /**
     * 
     * 校验属性是否不为空
     * @param obj 需要校验的属性(属性可以是:Collection，Array,String,Map)
     * @return true非空，false空
     */
    public static boolean isNotEmpty(Object obj)
    {
        return !isEmpty(obj);
    }
    
    /**
     * 拼装IN SQL，Oracle中IN语句超过1000个会查询报错，把它拆分成多个
     * <code>
     * t1.id IN (1) or t1.id IN (12) or t1.id IN (13)
     * </code>
     * <br>
     * 例：<br>
     * <strong>
     * &lt;bind name="_sql" value="@com.server.edu.util.MybatisUtil@concatIn('t1.architecture_id', condition.archIds)"/>
     *   <br>
        and (${_sql})
     * </strong>
     * @param sql 需要查询的字段
     * @param list ID集合，这里定义成Long类型是为了防止SQL注入
     * @return
     * @author  OuYangGuoDong
     * @see [类、类#方法、类#成员]
     */
    public static String concatIn(String sql, List<Long> list)
    {
        if (isNotEmpty(list))
        {
            StringBuffer sb = new StringBuffer();
            sb.append(sql + " IN (");
            int i = 1;
            for (Long id : list)
            {
                if (i > 999)
                {
                    sb.append(") or " + sql + " IN (");
                    i = 1;
                }
                if (i != 1)
                {
                    sb.append(",");
                }
                sb.append(id);
                i++;
            }
            
            sb.append(")");
            
            return sb.toString();
        }
        return null;
    }
}
